/** 颜色相关工具集 */

/**
 * 颜色值变深
 *
 * @param color 色值 hex 格式
 * @param level 色值度（可取0 ~ 1）
 * @returns 变深后的颜色值，hex 格式
 */
export const darken = (color: string, level: number): string => {
  const rgb = hexToRgb(color)
  if (!rgb) {
    return color
  }
  const newR = Math.max(0, Math.round(rgb.r - rgb.r * level))
  const newG = Math.max(0, Math.round(rgb.g - rgb.g * level))
  const newB = Math.max(0, Math.round(rgb.b - rgb.b * level))
  return rgbToHex(newR, newG, newB)
}

/**
 * 颜色值变浅
 *
 * @param color 色值 hex 格式
 * @param level 色值度（可取0 ~ 1）
 * @returns 变浅后的颜色值，hex 格式
 */
export const lighten = (color: string, level: number): string => {
  const rgb = hexToRgb(color)
  if (!rgb) {
    return color
  }
  const newR = Math.min(255, Math.round(rgb.r + (255 - rgb.r) * level))
  const newG = Math.min(255, Math.round(rgb.g + (255 - rgb.g) * level))
  const newB = Math.min(255, Math.round(rgb.b + (255 - rgb.b) * level))
  return rgbToHex(newR, newG, newB)
}

/**
 * hex 格式颜色转 rgb
 *
 * @param hex 色值 hex 格式
 * @returns
 */
export const hexToRgb = (hex: string) => {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
  return result
    ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16),
      }
    : null
}

/**
 * rgb 格式颜色转 hex
 *
 * @param r 色值 R
 * @param g 色值 G
 * @param b 色值 B
 * @returns
 */
export const rgbToHex = (r: number, g: number, b: number): string => {
  return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)
}
